A disassembler is a computer program that translates machine language, e.g. executable binary, into assembly language source code instructions. An executable binary consists of machine instructions of a specific processor or binary pseudocode for a virtual machine. The translated instructions are often formatted for human-readability rather than suitability for input to an assembler, making a disassembler principally a reverse-engineering tool. Disassembly is not an exact science. It is possible for a single program to have two or more distinct, yet accurate, disassemblies, i.e., sets of translated source code instructions.
Typically, the disassembly resembles the original source code from which the binary is created. However, assembly languages permit the use of symbolic constants and comments. As symbolic constants and comments are not necessary to the execution of the binary, an assembler usually removes symbolic constants and comments before creating the binary. As a result, a disassembler operating on a binary created accordingly generates assembler source code instructions lacking these constants and comments. Accordingly, the disassembled output becomes more difficult for a human to interpret than the original annotated source code.